// 辅助函数：将十六进制颜色转换为 RGB
function hexToRgb(hex: string): [number, number, number] {
  const bigint = parseInt(hex.slice(1), 16);
  return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255];
}

// 辅助函数：将 RGB 转换为十六进制颜色
function rgbToHex(r: number, g: number, b: number): string {
  return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
}

// 辅助函数：调整颜色亮度
function adjustBrightness(hex: string, factor: number): string {
  const rgb = hexToRgb(hex);
  const newRgb = rgb.map((val) =>
    Math.max(0, Math.min(255, Math.round(val + (255 - val) * factor)))
  ) as [number, number, number];
  return rgbToHex(...newRgb);
}

// 辅助函数：生成侧边栏颜色（基于主题色生成深色背景）
function generateSidebarColors(primary: string, isDark: boolean = false) {
  const rgb = hexToRgb(primary);

  if (isDark) {
    // 暗黑模式：使用更暗的颜色，基于主题色但更暗，减少视觉刺激
    const darkenFactor = 0.2; // 暗黑模式下降低到20%亮度，更柔和
    const newRgb = rgb.map((val) => Math.round(val * darkenFactor)) as [number, number, number];
    const sidebarBg = rgbToHex(...newRgb);

    // 生成悬停颜色（稍微亮一点，但不要太亮）
    const hoverRgb = rgb.map((val) => Math.min(255, Math.round(val * darkenFactor * 1.25))) as [
      number,
      number,
      number,
    ];
    const sidebarHover = rgbToHex(...hoverRgb);

    // 生成Logo背景色（更暗一点）
    const logoRgb = rgb.map((val) => Math.round(val * darkenFactor * 0.75)) as [
      number,
      number,
      number,
    ];
    const logoBg = rgbToHex(...logoRgb);

    return {
      "menu-background": sidebarBg,
      "menu-hover": sidebarHover,
      "sidebar-logo-background": logoBg,
      "menu-text": "#fff", // 暗黑模式下使用白色文字
    };
  } else {
    // 明亮模式：将主题色转换为深色背景，大幅降低亮度以减少视觉刺激
    const darkenFactor = 0.45; // 降低到原来的45%亮度，更暗更柔和
    const newRgb = rgb.map((val) => Math.round(val * darkenFactor)) as [number, number, number];
    const sidebarBg = rgbToHex(...newRgb);

    // 生成悬停颜色（稍微亮一点，但保持柔和）
    const hoverRgb = rgb.map((val) => Math.min(255, Math.round(val * darkenFactor * 1.15))) as [
      number,
      number,
      number,
    ];
    const sidebarHover = rgbToHex(...hoverRgb);

    // 生成Logo背景色（更暗一点）
    const logoRgb = rgb.map((val) => Math.round(val * darkenFactor * 0.85)) as [
      number,
      number,
      number,
    ];
    const logoBg = rgbToHex(...logoRgb);

    // 文字颜色：由于背景更暗，使用浅色文字以确保可读性
    const brightness = (newRgb[0] * 299 + newRgb[1] * 587 + newRgb[2] * 114) / 1000;
    // 如果背景亮度低于100，使用浅色文字，否则根据亮度判断
    const textColor = brightness < 100 ? "#bfcbd9" : brightness > 140 ? "#303133" : "#bfcbd9";

    return {
      "menu-background": sidebarBg,
      "menu-hover": sidebarHover,
      "sidebar-logo-background": logoBg,
      "menu-text": textColor,
    };
  }
}

export function generateThemeColors(
  primary: string,
  isDark: boolean = false,
  sidebarColor?: string
) {
  const colors: Record<string, string> = {
    primary,
  };

  // 生成浅色变体
  for (let i = 1; i <= 9; i++) {
    const factor = i * 0.1;
    colors[`primary-light-${i}`] = adjustBrightness(primary, factor);
  }

  // 生成深色变体
  colors["primary-dark-2"] = adjustBrightness(primary, -0.2);

  // 生成侧边栏颜色：
  // - 如果用户明确提供了 sidebarColor，则严格按该颜色设置背景，不再强制变暗
  // - 如果未提供，则基于主题色生成一套更适合侧边栏的深色体系
  if (sidebarColor && sidebarColor.trim() !== "") {
    const explicit = sidebarColor.trim();

    // 计算亮度用于选择文字颜色（YIQ 近似）
    const [r, g, b] = hexToRgb(explicit);
    const brightness = (r * 299 + g * 587 + b * 114) / 1000;

    // 基于背景自动选择文字颜色
    const textColor = brightness > 160 ? "#303133" : brightness > 120 ? "#606266" : "#bfcbd9";

    // 悬停与 Logo 背景做轻微明暗调整（不破坏主色感知）
    const hover =
      brightness > 160
        ? adjustBrightness(explicit, -0.06) // 浅背景：hover 微微变暗
        : adjustBrightness(explicit, 0.08); // 深背景：hover 稍微变亮
    const logoBg =
      brightness > 160 ? adjustBrightness(explicit, -0.1) : adjustBrightness(explicit, -0.05);

    Object.assign(colors, {
      "menu-background": explicit,
      "menu-hover": hover,
      "sidebar-logo-background": logoBg,
      "menu-text": textColor,
    });
  } else {
    const sidebarColors = generateSidebarColors(primary, isDark);
    Object.assign(colors, sidebarColors);
  }

  return colors;
}

export function applyTheme(colors: Record<string, string>) {
  const el = document.documentElement;

  Object.entries(colors).forEach(([key, value]) => {
    // Element Plus 颜色变量
    if (
      key.startsWith("primary") ||
      key.startsWith("success") ||
      key.startsWith("warning") ||
      key.startsWith("danger") ||
      key.startsWith("info")
    ) {
      el.style.setProperty(`--el-color-${key}`, value);
    } else {
      // 侧边栏颜色变量
      el.style.setProperty(`--${key}`, value);
    }
  });
}

export function toggleDarkMode(isDark: boolean) {
  if (isDark) {
    document.documentElement.classList.add("dark");
  } else {
    document.documentElement.classList.remove("dark");
  }
}
